"""
@name : 4-16自由作业
@author : zhaosiyuan
@projectname: PythonProject
"""
# 课前预热 —— 猜数字
# num = 68
# for i in range(3):
#     guess = input("请输入您的猜想：")
#
#     if guess.isdigit():
#         guess = int(guess)
#         if guess == num:
#             print("恭喜你，答对了！")
#         elif guess > num:
#             print(f"很遗憾你猜大了，您还有{2-i}次机会")
#         elif guess < num:
#             print(f"很遗憾你猜小了，您还有{2 - i}次机会")
#     else:
#         print("您的输入不合法，请重新输入")
# else:
#     print("游戏结束")

# 1、获取n天前的日期
# from datetime import datetime
# from datetime import timedelta
# def get_date(days=N):
#     return datetime.now() - timedelta(days=days)
# N = 5
# get_date(2022,4,16,N)

# import datetime
# def getDay(y=2017, m=8, d=15, n=0):
#     the_date = datetime.datetime(y, m, d)
#     result_date = the_date + datetime.timedelta(days=n)
#     d = result_date.strftime('%Y-%m-%d')
#     print(d)
#     return d
#
# getDay(2017, 8, 15, 21) #8月15日后21天
# # getday(2017,9,1,-10) #9月1日前10天

# 2、输出指定文件夹下的文件
# import os
# print(os.listdir('C:\\三创学习笔记'))

# 3、列表去重
# orgList = [2, 3, 3, 6, 7, 9, 10, 10, 16]
# formaList = list(set(orgList))
# print(formaList)

# orgList = [1, 0, 3,7,7,5]
# #list()方法是把字符串str或元组转成数组
# formatList = list({}.fromkeys(orgList).keys())
# print (formatList)

# 4、如何在一个函数内部修改全局变量
# global

# 5、如何跨模块共享全局变量
# 在单个程序中跨模块共享信息的规范方法是创建一个特殊模块（通常称为config或cfg）。
# 只需在应用程序的所有模块中导入配置模块；然后该模块可用作全局名称。
# 因为每个模块只有一个实例，所以对模块对象所做的任何更改都会在任何地方反映出来。

# 6、基本数据类型
# 整数（int）、浮点数（float）、复数、list、dict、set、tuple、string
# 可变数据类型：list、dict、set
# 不可变数据类型：数值类型（int、float、bool）、string、tuple
# 可变数据类型：当该数据类型对应的变量的值发生了变化时，如果它对应的内存地址不发生改变，那么这个数据类型就是可变数据类型。
# 不可变数据类型：当该数据类型对应的变量的值发生了变化时，如果它对应的内存地址发生了改变，那么这个数据类型就是不可变数据类型。
# 总结：可变数据类型更改值后，内存地址不发生改变。不可变数据类型更改值后，内存地址发生改变。



# 7、随机整数、随机小数
# import random
# decimals = random.random()
# integer = random.randint(1, 10)
# decimals2 = random.uniform(1, 10)
# print(decimals)
# print(integer)
# print(decimals2)

# 8、a+=1与a=a+1有什么区别
# >>> a = 1
# >>> id(a)
# 140106201823136
# >>> a += 1
# >>> a
# 2
# >>> id(a)
# 140106201823168
# >>> b = [1,2]
# >>> id(b)
# 140106202719752
# >>> b += 3
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'int' object is not iterable
# >>> b += [3]
# >>> b
# [1, 2, 3]
# >>> id(b)
# 140106202719752
# >>> c = 4
# >>> c = c + 1
# >>> c
# 5
# >>> d = 5
# >>> id(d)
# 140106201823264
# >>> d = d+1
# >>> id(d)
# 140106201823296
# >>> e = [1,2]
# >>> id(e)
# 140106202719880
# >>> e = e + [4]
# >>> e
# [1, 2, 4]
# >>> id(e)
# 140106202720584

# 10、什么是pep8？说出5点它的标准
# PEP8：之前是谷歌内部的编码规则，后广为流传
# 使用4个空格的缩进，不要使用制表符
# 折行以确保其不会超过79个字符。这有助于小显示器用户阅读，也可以让大显示其能并排显示几个代码文件。
# 使用空行分隔函数和类，以及函数内的大块代码
# 如果可能，注释占一行
# 使用文档字符串
# 运算符周围和逗号后面使用空格，但是括号里不加空格：a = f(1,2) + g(3,4)

# 11、找出一个字符串中第一个重复的字符
# str = 'dsjgdgwegbombii'
# # for i in range(len(str)):
# for j in str:
#     if str.count(j) >= 2:
#         print(j)
#     break

# 12、简述深拷贝与浅拷贝
# 主要针对容器里面包容可变数据类型的情况才会有深浅拷贝的区别
# 在python中，对象赋值实际上是对象的引用。当创建一个对象，然后把它赋给另一个变量的时候，
# python并没有拷贝这个对象，而只是拷贝了这个对象的引用，我们称之为浅拷贝。
# 浅拷贝只会拷贝第一层的地址，而没有拷贝具体的值
# 深拷贝会拷贝每一层的值，生成一个全新的值
#>>> d1 = {"a":[1,2], "b":4}
# >>> a = [1,2,3]
# >>> b = a
# >>> b.append(6)
# >>> b
# [1, 2, 3, 6]
# >>> a
# [1, 2, 3, 6]
# >>> id(b)
# 140111846478792
# >>> id(a)
# 140111846478792
# >>> import copy
# >>> d3 = copy.deepcopy(d1)
# >>> d3
# {'a': [1, 2], 'b': 4}
# >>> d1['a'].append(6)
# >>> d1
# {'a': [1, 2, 6], 'b': 4}
# >>> d3
# {'a': [1, 2], 'b': 4}
# >>>


# 13、简述python内存机制
#1.引用计数机制
# 2.垃圾回收机制
# 2.1标记清除机制
# 2.2分代回收机制
# 3.内存池机制

# 14、使用python实现冒泡排序，快速排序
# 冒泡排序（Bubble Sort）也是一种简单直观的排序算法。
# 它重复地走访过要排序的数列，一次比较两个元素，如果他们的顺序错误就把他们交换过来。
# 走访数列的工作是重复地进行直到没有再需要交换，也就是说该数列已经排序完成。
# 这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
# def bubbleSort(arr):
#     for i in range(1, len(arr)):
#         for j in range(0, len(arr)-i):
#             if arr[j] > arr[j+1]:
#                 arr[j], arr[j+1] = arr[j+1], arr[j]
#     print(arr)
#     return
#
# arr = [1, 23, 45, 6, 7, 18]
# bubbleSort(arr)

# 快速排序
# def quick_sort(array, left, right):
#     if left >= right:
#         return
#     low = left
#     high = right
#     key = array[low]
#     while left < right:
#         while left < right and array[right] > key:
#             right -= 1
#         array[left] = array[right]
#         while left < right and array[left] <= key:
#             left += 1
#         array[right] = array[left]
#     array[right] = key
#     quick_sort(array, low, left - 1)
#     quick_sort(array, left + 1, high)
#     print(array)
# array = [1, 23, 45, 6, 7, 18]
# quick_sort(array, 18, 1)

# def quick_sort(array, l, r):
#     if l >= r:
#         return
#     stack = []
#     stack.append(l)
#     stack.append(r)
#     while stack:
#         low = stack.pop(0)
#         high = stack.pop(0)
#         if high - low <= 0:
#             continue
#         x = array[high]
#         i = low - 1
#         for j in range(low, high):
#             if array[j] <= x:
#                 i += 1
#                 array[i], array[j] = array[j], array[i]
#         array[i + 1], array[high] = array[high], array[i + 1]
#         stack.extend([low, i, i + 2, high])
#
# array = [1, 23, 45, 6, 7, 18]
# quick_sort(array, 18, 1)

# 15、回文数
# str1 = input("请输入你要检测的字符串：")
# str2 = str1[::-1]
# if str1 == str2:
#     print(f"{str1}是回文数")
# else:
#     print(f"{str1}不是回文数")

# 提取ip 时间 运营商
import datetime
import requests
import json

# 打开要保存数据的文档
with open('result.txt', 'w', encoding='utf-8') as fp1:
    # 定义一个数组接收文档每一行
    array = []
    with open('C:\\三创学习笔记\\weblog.txt', 'r') as fp:
        #读取文档
        lst = fp.readlines()
        # 一个个读取文档中的字符串 一行相当于一个元素
        for i in range(len(lst)):
            # 定义一个临时数组接收每一行分割后的元素
            temp_list = []
            # 将每一个元素（每一行）按空格分割
            for element in lst[i].split():
                # 分割后的每一个元素写入tem_list
                temp_list.append(element)
            # 再写入最终的数组
            array.append(temp_list)
            # 将时间格式转换成所需的时间格式
            newtime = datetime.datetime.strptime(array[i][3], '[%d/%b/%Y:%H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')
            # 获取ip所得的详细信息
            response = requests.get(f'https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip={array[i][0]}')
            # 用josn将格式转换成字典
            ip_information = response.json()
            # 提取字典中的ISP运营商
            isp = ip_information["data"]["isp"]
            # 提取字典中的region省份
            region = ip_information["data"]["region"]
            # 将所需的元素写入文档
            fp1.write(newtime + "," + region + "," + isp + "," + array[i][9] + '\n')
